Isomorphic SEPC256K1 JS
An ultra lightweight (1.6kb minify + gzip) Universal JavaScript Elliptic Curve Digital Signature Algorithm (ECDSA) for the Koblitz secp256k1 curve.
Cross platform support for Node.js and Deno.
Exports
The npm package isomorphic-secp256k1-js
features optimal JavaScript module design. It doesn’t have a main index module, so use deep imports from the ECMAScript modules that are exported via the package.json
field exports
:
Impact on your bundle
Using the esbuild minify and gzip you can generate a digital signature with less than 1.6kb impact to your bundle.
cat dist/sign.mjs | wc
1 86 2898
cat dist/sign.mjs.zip | wc
10 59 1604
cat dist/get_public_key.mjs | wc
1 27 1389
cat dist/get_public_key.mjs.zip | wc
3 29 1006
cat dist/recover_public_key.mjs | wc
1 50 2055
cat dist/recover_public_key.mjs.zip | wc
4 38 1360
Installation
For Node.js, to install isomorphic-secp256k1-js
run:
npm i isomorphic-secp256k1-js
For Deno.js, at the root of your project add a deno.json
file and include these import paths:
{
"imports": {
"universal-sha256-js/": "https://deno.land/x/sha256js/",
"universal-hmac-sha256-js/": "https://deno.land/x/hmacsha256/",
"universal-hmac-sha256-js/hmac-sha256-node.mjs": "https://deno.land/x/hmacsha256/hmac-sha256-deno.mjs"
}
}
Then import:
import recover_public_key from "https://deno.land/x/secp256k1js/recover_public_key.mjs";
import sign from "https://deno.land/x/secp256k1js/sign.mjs";
import get_public_key from "https://deno.land/x/secp256k1js/get_public_key.mjs";
Examples
Recover public key from private key.
const private_key = new Uint8Array([
210, 101, 63, 247, 203, 178, 216, 255, 18, 154, 194, 126, 245, 120, 28, 230,
139, 37, 88, 196, 26, 116, 175, 31, 45, 220, 166, 53, 203, 238, 240, 125,
]);
console.log(get_public_key(private_key));
Generate a secp25k1 digital signature.
const private_key = new Uint8Array([
210, 101, 63, 247, 203, 178, 216, 255, 18, 154, 194, 126, 245, 120, 28, 230,
139, 37, 88, 196, 26, 116, 175, 31, 45, 220, 166, 53, 203, 238, 240, 125,
]);
const data = Uint8Array.from([104, 101, 108, 108, 111]);
sign({ data, private_key }).then(console.log);
The logged output is { r: [23, …, 89], s: [111, …, 142], v: 1 }
Note
As this package is ESM if you need to require it in a Common JS package, then you can require like this:
(async function () {
const { default: recover_public_key } = await import(
"isomorphic-secp256k1-js/recover_public_key.mjs"
);
const { number_to_array } = await import("./private/utils.mjs");
const key_pair = await recover_public_key({
data: Uint8Array.from([2, 33, 65, 233, 23, 23, 123, 244, 23, 23, 123, 244]),
signature: {
r: number_to_array(
50172533143525448505731076092836454339589141171079665638497512992118311974590n
),
s: number_to_array(
3372897403575535231543296615264124933490702058654620386530787287980439847001n
),
v: 0,
},
});
console.log(key_pair);
})();
Logged output was Uint8Array(33) [2,192,222,210,188,31,19,5,…
Requirements
Supported runtime environments: